package others;

import java.util.Stack;

/**
 * @author pengfei.hpf
 * @date 2020/3/7
 * @verdion 1.0.0
 * 224. 基本计算器
 * 实现一个基本的计算器来计算一个简单的字符串表达式的值。
 *
 * 字符串表达式可以包含左括号 ( ，右括号 )，加号 + ，减号 -，非负整数和空格  。
 *
 * 示例 1:
 *
 * 输入: "1 + 1"
 * 输出: 2
 * 示例 2:
 *
 * 输入: " 2-1 + 2 "
 * 输出: 3
 * 示例 3:
 *
 * 输入: "(1+(4+5+2)-3)+(6+8)"
 * 输出: 23
 * 说明：
 *
 * 你可以假设所给定的表达式都是有效的。
 * 请不要使用内置的库函数 eval。
 */
public class CalculateWithbracket {

    public int calculate(String s){
        if(s == null || s.length() == 0){
            return 0;
        }
        Stack<Integer> stack = new Stack<>();
        char sign = '+';
        s = s.trim();
        char[] chars = s.toCharArray();
        int num = 0;
        int len = chars.length;
        for(int i = 0 ; i < len; i++){
            char c = chars[i];
            if(c == ' '){
                continue;
            }
            if(c == '('){
                num = calculate(s.substring(i + 1));
            }
            if(isDig(c)){
                num = num * 10 + (c - '0');
            }
            if(!isDig(c) || i == len - 1){
                switch (sign){
                    case '+':
                        stack.push(num);
                        break;
                    case '-':
                        stack.push(-num);
                        break;
                    case '*':
                        int last = stack.pop();
                        num = last * num;
                        stack.push(num);
                        break;
                    case '/':
                        last = stack.pop();
                        num = last / num;
                        stack.push(num);
                        break;
                }

                sign = c;
                num = 0;
            }
            if(c == ')'){
                break;
            }
        }
        int res = 0;
        while(!stack.isEmpty()){
            res += stack.pop();
        }
        return res;

    }

    private boolean isDig(char c){
        return c >= '0' && c <= '9';
    }
}
